home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / ugoku / src / vdsys / dv02sx.c < prev    next >
Text File  |  1994-11-16  |  37KB  |  1,516 lines

  1. /*
  2.             V02 RECORD
  3.             for    GUI
  4.             Hiroshi TODA
  5.             1993 9 3
  6.  
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <winb.h>
  13. #include <te.h>
  14. #include <fntb.h>
  15. #include <gui.h>
  16. #include <file_dlg.h>
  17. #include <egb.h>
  18. #include <mos.h>
  19. #include <snd.h>
  20. #include "ugoku.h"
  21.  
  22. extern char *guiEgbPtr;            /* EGB work */
  23. extern int mouse( int );
  24.  
  25. /*
  26.     v02 direct save
  27. */
  28.  
  29. extern void v02_trans_128_0();
  30. extern void v02_trans_160_0();
  31. extern void v02_trans_192_0();
  32. extern void v02_trans_256_0();
  33. extern void v02_trans_320_0();
  34.  
  35. extern void v02_snd_trans_128_4( char *, int, char *, int, int, int,
  36.                      char *, char *, char * ) ;
  37. extern void v02_snd_trans_128_5( char *, int, char *, int, int, int,
  38.                      char *, char *, char * ) ;
  39. extern void v02_snd_trans_128_6( char *, int, char *, int, int, int,
  40.                      char *, char *, char * ) ;
  41. extern void v02_snd_trans_128_7( char *, int, char *, int, int, int,
  42.                      char *, char *, char * ) ;
  43.  
  44. extern void v02_snd_trans_160_4( char *, int, char *, int, int, int,
  45.                      char *, char *, char * ) ;
  46. extern void v02_snd_trans_160_5( char *, int, char *, int, int, int,
  47.                      char *, char *, char * ) ;
  48. extern void v02_snd_trans_160_6( char *, int, char *, int, int, int,
  49.                      char *, char *, char * ) ;
  50. extern void v02_snd_trans_160_7( char *, int, char *, int, int, int,
  51.                      char *, char *, char * ) ;
  52.  
  53. extern void v02_snd_trans_192_4( char *, int, char *, int, int, int,
  54.                      char *, char *, char * ) ;
  55. extern void v02_snd_trans_192_5( char *, int, char *, int, int, int,
  56.                      char *, char *, char * ) ;
  57. extern void v02_snd_trans_192_6( char *, int, char *, int, int, int,
  58.                      char *, char *, char * ) ;
  59. extern void v02_snd_trans_192_7( char *, int, char *, int, int, int,
  60.                      char *, char *, char * ) ;
  61.  
  62. extern void v02_snd_trans_256_4( char *, int, char *, int, int, int,
  63.                      char *, char *, char * ) ;
  64. extern void v02_snd_trans_256_5( char *, int, char *, int, int, int,
  65.                      char *, char *, char * ) ;
  66. extern void v02_snd_trans_256_6( char *, int, char *, int, int, int,
  67.                      char *, char *, char * ) ;
  68. extern void v02_snd_trans_256_7( char *, int, char *, int, int, int,
  69.                      char *, char *, char * ) ;
  70.  
  71. extern void v02_snd_trans_320_4( char *, int, char *, int, int, int,
  72.                      char *, char *, char * ) ;
  73. extern void v02_snd_trans_320_5( char *, int, char *, int, int, int,
  74.                      char *, char *, char * ) ;
  75. extern void v02_snd_trans_320_6( char *, int, char *, int, int, int,
  76.                      char *, char *, char * ) ;
  77. extern void v02_snd_trans_320_7( char *, int, char *, int, int, int,
  78.                      char *, char *, char * ) ;
  79.  
  80. extern void v02_trans_128_9600( char *, int, char *, int, int, int,
  81.                      char *, char *, char * ) ;
  82. extern void v02_trans_128_19200( char *, int, char *, int, int, int,
  83.                      char *, char *, char * ) ;
  84. extern void v02_trans_160_9600( char *, int, char *, int, int, int,
  85.                      char *, char *, char * ) ;
  86. extern void v02_trans_160_19200( char *, int, char *, int, int, int,
  87.                      char *, char *, char * ) ;
  88. extern void v02_trans_192_9600( char *, int, char *, int, int, int,
  89.                      char *, char *, char * ) ;
  90. extern void v02_trans_192_19200( char *, int, char *, int, int, int,
  91.                      char *, char *, char * ) ;
  92. extern void v02_trans_256_9600( char *, int, char *, int, int, int,
  93.                      char *, char *, char * ) ;
  94. extern void v02_trans_256_19200( char *, int, char *, int, int, int,
  95.                      char *, char *, char * ) ;
  96. extern void v02_trans_320_9600( char *, int, char *, int, int, int,
  97.                      char *, char *, char * ) ;
  98. extern void v02_trans_320_19200( char *, int, char *, int, int, int,
  99.                      char *, char *, char * ) ;
  100.  
  101. extern int v02_digit_timing_flag0[];    /* flag */
  102. extern char *v02_digit_buf0[];    /* 圧縮データ転送先 */
  103. extern int v02_digit_counter;        /* conter */
  104. extern int v02_digit_wait;        /* wait */
  105. extern char *v02_digit_work ;    /* VRAMデータ一時保存領域 */
  106. extern char *v02_digit_ytab ;    /* Ytable */
  107. extern char *v02_digit_ctab ;    /* Ctable */
  108.  
  109. v02_digit_save_0( name, frame, md, wt, ytab, ctab, v02tab )
  110. char *name ;
  111. int frame, md, wt ;
  112. char *ytab, *ctab, *v02tab ;
  113. {
  114.     FILE *fp;
  115.     int v02xd = 128, v02yd = 96;
  116.     int i, j, n, f, size, skip, total, bind ;
  117.     char head[256], bind_head[32] ;
  118.     char *buf, *b[8];        /* buffer */
  119.  
  120.     switch( md ){
  121.         case 1: v02xd = 128; v02yd = 96;
  122.             break;
  123.         case 2: v02xd = 160; v02yd = 120;
  124.             break;
  125.         case 3: v02xd = 192; v02yd = 144;
  126.             break;
  127.         case 4: v02xd = 256; v02yd = 192;
  128.             break;
  129.         case 5: v02xd = 320; v02yd = 240;
  130.             break;
  131.         default: return 58 ;
  132.     }
  133.     if(
  134.      ( buf = (char *)TL_malloc( (16+v02xd*v02yd*2*3/8)*8 + v02xd*v02yd*2 ) )
  135.      == NULL
  136.     )return 7;
  137.     if( ( fp = fopen( name, "wb" ) ) == NULL ){
  138.         TL_free( buf );
  139.         return 2;
  140.     }
  141.  
  142.     for( i= 0 ; i<8 ; i++ )
  143.     {
  144.         b[i] = buf + (16+v02xd*v02yd*2*3/8)*i ;
  145.         v02_digit_buf0[i] = b[i] + 16 ;
  146.         v02_digit_timing_flag0[i] = 0;
  147.  
  148.         WORD( b[i] + 0 ) = 1 ;
  149.         WORD( b[i] + 2 ) = 0x2104 ;
  150.         DWORD( b[i] + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
  151.         DWORD( b[i] + 8 ) = 1 ;
  152.         BYTE( b[i] + 12 ) = 0 ;
  153.         BYTE( b[i] + 13 ) = 0xff ;
  154.         WORD( b[i] + 14 ) = v02xd*v02yd*2*3/8 ;
  155.     }
  156.  
  157.     v02_digit_counter = 0 ;
  158.  
  159.     v02_digit_wait = wt;
  160.     v02_digit_work = buf + (16+v02xd*v02yd*2*3/8)*8 ;
  161.     v02_digit_ytab = ytab;
  162.     v02_digit_ctab = ctab;
  163.  
  164.     for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
  165.     DWORD( head ) = 0x32304456;        /* ID = VD02 */
  166.     DWORD( head + 4 ) = 0 ;            /* total length */
  167.     DWORD( head + 8 ) = 0 ;            /* total frame */
  168.     DWORD( head + 12 ) = 6;        /* dataの種類番号(bit/ピクセル) */
  169.     DWORD( head + 16 ) = v02xd;        /* 横 */
  170.     DWORD( head + 20 ) = v02yd;        /* 縦 */
  171.     DWORD( head + 24 ) = wt;        /* wait */
  172.     DWORD( head + 28 ) = 8;            /* バインダ内こま数 */
  173.     DWORD( head + 32 ) = 8000*6/wt;        /* sound samp. freq */
  174.     DWORD( head + 36 ) = 6400;        /* バインダ内snd data Byte数 */
  175.     if( fwrite( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  176.         fclose(fp);
  177.         TL_free( buf );
  178.         return 2;            /* 2 = error num. */
  179.     }
  180.     if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){    /* v02 table */
  181.         fclose(fp);
  182.         TL_free( buf );
  183.         return 2;            /* 2 = error num. */
  184.     }
  185.  
  186.     switch( md ){
  187.         case 1: EGB_displayPage(guiEgbPtr,0,1);
  188.             EGB_resolution(guiEgbPtr,0,16);
  189.             EGB_writePage(guiEgbPtr,0);
  190.             EGB_displayStart(guiEgbPtr,2,8,1);
  191.             EGB_digitize(guiEgbPtr,1);
  192.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  193.             skip = 32 + 6400 ;
  194.             mouse(1);
  195.  
  196.             SND_fm_timer_b_set( 0, 0 ) ;
  197.             VSYNC_init();
  198.             VSYNC_setEvent( v02_trans_128_0 );
  199.  
  200.             f = 0 ;
  201.             for( i=0; i<frame; i += 8 )
  202.             {
  203.                 fseek( fp, skip, SEEK_CUR );
  204.  
  205.                 if( frame - i >= 8 )
  206.                 n = 8 ;
  207.                 else
  208.                 n = frame - i ;
  209.  
  210.                 for( j=0; j<n; j++ )
  211.                 {
  212.                 while( v02_digit_timing_flag0[j] == 0 );
  213.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  214.                     break;
  215.                 v02_digit_timing_flag0[j] = 0;
  216.                 f++ ;
  217.                 }
  218.             }
  219.  
  220.             VSYNC_end();
  221.             SND_fm_timer_b_start() ;
  222.             break;
  223.  
  224.         case 2: EGB_displayPage(guiEgbPtr,0,1);
  225.             EGB_resolution(guiEgbPtr,0,16);
  226.             EGB_writePage(guiEgbPtr,0);
  227.             EGB_displayStart(guiEgbPtr,2,8,1);
  228.             EGB_digitize(guiEgbPtr,1);
  229.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  230.             skip = 32 + 6400 ;
  231.             mouse(1);
  232.  
  233.             SND_fm_timer_b_set( 0, 0 ) ;
  234.             VSYNC_init();
  235.             VSYNC_setEvent( v02_trans_160_0 );
  236.  
  237.             f = 0 ;
  238.             for( i=0; i<frame; i += 8 )
  239.             {
  240.                 fseek( fp, skip, SEEK_CUR );
  241.  
  242.                 if( frame - i >= 8 )
  243.                 n = 8 ;
  244.                 else
  245.                 n = frame - i ;
  246.  
  247.                 for( j=0; j<n; j++ )
  248.                 {
  249.                 while( v02_digit_timing_flag0[j] == 0 );
  250.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  251.                     break;
  252.                 v02_digit_timing_flag0[j] = 0;
  253.                 f++ ;
  254.                 }
  255.             }
  256.  
  257.             VSYNC_end();
  258.             SND_fm_timer_b_start() ;
  259.             break;
  260.  
  261.         case 3: EGB_displayPage(guiEgbPtr,0,1);
  262.             EGB_resolution(guiEgbPtr,0,16);
  263.             EGB_writePage(guiEgbPtr,0);
  264.             EGB_displayStart(guiEgbPtr,2,4,1);
  265.             EGB_digitize(guiEgbPtr,1);
  266.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  267.             skip = 32 + 6400 ;
  268.             mouse(1);
  269.  
  270.             SND_fm_timer_b_set( 0, 0 ) ;
  271.             VSYNC_init();
  272.             VSYNC_setEvent( v02_trans_192_0 );
  273.  
  274.             f = 0 ;
  275.             for( i=0; i<frame; i += 8 )
  276.             {
  277.                 fseek( fp, skip, SEEK_CUR );
  278.  
  279.                 if( frame - i >= 8 )
  280.                 n = 8 ;
  281.                 else
  282.                 n = frame - i ;
  283.  
  284.                 for( j=0; j<n; j++ )
  285.                 {
  286.                 while( v02_digit_timing_flag0[j] == 0 );
  287.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  288.                     break;
  289.                 v02_digit_timing_flag0[j] = 0;
  290.                 f++ ;
  291.                 }
  292.             }
  293.  
  294.             VSYNC_end();
  295.             SND_fm_timer_b_start() ;
  296.             break;
  297.  
  298.         case 4: EGB_displayPage(guiEgbPtr,0,1);
  299.             EGB_resolution(guiEgbPtr,0,16);
  300.             EGB_writePage(guiEgbPtr,0);
  301.             EGB_displayStart(guiEgbPtr,2,4,1);
  302.             EGB_digitize(guiEgbPtr,1);
  303.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  304.             skip = 32 + 6400 ;
  305.             mouse(1);
  306.  
  307.             SND_fm_timer_b_set( 0, 0 ) ;
  308.             VSYNC_init();
  309.             VSYNC_setEvent( v02_trans_256_0 );
  310.  
  311.             f = 0 ;
  312.             for( i=0; i<frame; i += 8 )
  313.             {
  314.                 fseek( fp, skip, SEEK_CUR );
  315.  
  316.                 if( frame - i >= 8 )
  317.                 n = 8 ;
  318.                 else
  319.                 n = frame - i ;
  320.  
  321.                 for( j=0; j<n; j++ )
  322.                 {
  323.                 while( v02_digit_timing_flag0[j] == 0 );
  324.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  325.                     break;
  326.                 v02_digit_timing_flag0[j] = 0;
  327.                 f++ ;
  328.                 }
  329.             }
  330.  
  331.             VSYNC_end();
  332.             SND_fm_timer_b_start() ;
  333.             break;
  334.  
  335.         case 5: EGB_displayPage(guiEgbPtr,0,1);
  336.             EGB_resolution(guiEgbPtr,0,16);
  337.             EGB_writePage(guiEgbPtr,0);
  338.             EGB_displayStart(guiEgbPtr,2,4,1);
  339.             EGB_digitize(guiEgbPtr,1);
  340.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  341.             skip = 32 + 6400 ;
  342.             mouse(1);
  343.  
  344.             SND_fm_timer_b_set( 0, 0 ) ;
  345.             VSYNC_init();
  346.             VSYNC_setEvent( v02_trans_320_0 );
  347.  
  348.             f = 0 ;
  349.             for( i=0; i<frame; i += 8 )
  350.             {
  351.                 fseek( fp, skip, SEEK_CUR );
  352.  
  353.                 if( frame - i >= 8 )
  354.                 n = 8 ;
  355.                 else
  356.                 n = frame - i ;
  357.  
  358.                 for( j=0; j<n; j++ )
  359.                 {
  360.                 while( v02_digit_timing_flag0[j] == 0 );
  361.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  362.                     break;
  363.                 v02_digit_timing_flag0[j] = 0;
  364.                 f++ ;
  365.                 }
  366.             }
  367.  
  368.             VSYNC_end();
  369.             SND_fm_timer_b_start() ;
  370.             break;
  371.     }    
  372.  
  373.             /* mute */
  374.     int s ;
  375.     SND_get_elevol_mute( &s ) ;
  376.     SND_elevol_mute( s & 0xfffffff3 ) ;
  377.  
  378.     EGB_digitize(guiEgbPtr,0);
  379.     EGB_displayPage(guiEgbPtr,0,0);
  380.  
  381.     EGB_color( guiEgbPtr, 1, 0 ) ;
  382.     EGB_clearScreen( guiEgbPtr ) ;            /*    画面をきれいにしよう */
  383.  
  384.     fseek( fp, 0, SEEK_SET );
  385.     fseek( fp, 256+32768+512, SEEK_CUR );
  386.  
  387.     for( i=0 ; i<6400 ; i += 4 )
  388.         DWORD( buf + i ) = 0x80808080 ;
  389.     bind = 0 ;
  390.     for( i=0 ; i<f ; i += 8 )
  391.     {
  392.         if( f - i >= 8 )
  393.             n = 8 ;
  394.         else
  395.             n = f - i ;
  396.  
  397.         for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
  398.         DWORD( bind_head ) = bind;
  399.         DWORD( bind_head + 4 ) = 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
  400.         if( fwrite( bind_head, 32, 1, fp ) < 1 )
  401.         {
  402.             fclose(fp);
  403.             TL_free( buf );
  404.             return 2;            /* 2 = error num. */
  405.         }
  406.         if( fwrite( buf, 6400, 1, fp ) < 1 )
  407.         {
  408.             fclose(fp);
  409.             TL_free( buf );
  410.             return 2;            /* 2 = error num. */
  411.         }
  412.         if( n < 8 )
  413.             break ;
  414.         fseek( fp, (16 + v02xd*v02yd*2*3/8)*8, SEEK_CUR );
  415.         bind++ ;
  416.     }
  417.  
  418.         /* total data size 修正 */
  419.  
  420.     total = 32768 + 512 ;
  421.     if( f%8 )
  422.         total = total + (f/8 + 1)*(32+6400) ;
  423.     else
  424.         total = total + f/8*(32+6400) ;
  425.     total = total + f*(v02xd*v02yd*2*3/8 + 16) ;
  426.  
  427.     fseek( fp, 0, SEEK_SET );
  428.     DWORD( head + 4 ) = total ;        /* total length */
  429.     DWORD( head + 8 ) = f;            /* total frame     */
  430.     if( fwrite( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  431.         fclose(fp);
  432.         TL_free( buf );
  433.         return 2;            /* 2 = error num. */
  434.     }
  435.  
  436.     fclose(fp);
  437.     TL_free( buf );
  438.     if( f < frame )return 2;
  439.     else return 0;
  440. }
  441.  
  442. /* サンプリングレート 9600 19200 サポート版(fq=0:9600 fq=1:19200) */
  443.  
  444. v02_digit_save_0_2( name, frame, md, fq, wt, ytab, ctab, v02tab )
  445. char *name ;
  446. int frame, md, fq, wt ;
  447. char *ytab, *ctab, *v02tab ;
  448. {
  449.     FILE *fp;
  450.     int v02xd = 128, v02yd = 96;
  451.     int i, j, n, f, freq, size, skip, total, bind ;
  452.     char head[256], bind_head[32] ;
  453.     char *buf, *b[8];        /* buffer */
  454.  
  455.     switch( fq ){
  456.         case 0: freq = 9600 ;
  457.             break;
  458.         case 1: freq = 19200 ;
  459.             break;
  460.         default: return 58 ;
  461.     }
  462.     switch( md ){
  463.         case 1: v02xd = 128; v02yd = 96;
  464.             break;
  465.         case 2: v02xd = 160; v02yd = 120;
  466.             break;
  467.         case 3: v02xd = 192; v02yd = 144;
  468.             break;
  469.         case 4: v02xd = 256; v02yd = 192;
  470.             break;
  471.         case 5: v02xd = 320; v02yd = 240;
  472.             break;
  473.         default: return 58 ;
  474.     }
  475.     if(
  476.      ( buf = (char *)TL_malloc( (16+v02xd*v02yd*2*3/8)*8 + v02xd*v02yd*2 ) )
  477.      == NULL
  478.     )return 7;
  479.     if( ( fp = fopen( name, "wb" ) ) == NULL ){
  480.         TL_free( buf );
  481.         return 2;
  482.     }
  483.  
  484.     for( i= 0 ; i<8 ; i++ )
  485.     {
  486.         b[i] = buf + (16+v02xd*v02yd*2*3/8)*i ;
  487.         v02_digit_buf0[i] = b[i] + 16 ;
  488.         v02_digit_timing_flag0[i] = 0;
  489.  
  490.         WORD( b[i] + 0 ) = 1 ;
  491.         WORD( b[i] + 2 ) = 0x2104 ;
  492.         DWORD( b[i] + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
  493.         DWORD( b[i] + 8 ) = 1 ;
  494.         BYTE( b[i] + 12 ) = 0 ;
  495.         BYTE( b[i] + 13 ) = 0xff ;
  496.         WORD( b[i] + 14 ) = v02xd*v02yd*2*3/8 ;
  497.     }
  498.  
  499.     v02_digit_counter = 0 ;
  500.  
  501.     v02_digit_wait = wt;
  502.     v02_digit_work = buf + (16+v02xd*v02yd*2*3/8)*8 ;
  503.     v02_digit_ytab = ytab;
  504.     v02_digit_ctab = ctab;
  505.  
  506.     for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
  507.     DWORD( head ) = 0x32304456;        /* ID = VD02 */
  508.     DWORD( head + 4 ) = 0 ;            /* total length */
  509.     DWORD( head + 8 ) = 0 ;            /* total frame */
  510.     DWORD( head + 12 ) = 7;        /* dataの種類番号(mvbType) */
  511.     DWORD( head + 16 ) = v02xd;        /* 横 */
  512.     DWORD( head + 20 ) = v02yd;        /* 縦 */
  513.     DWORD( head + 24 ) = wt;        /* wait */
  514.     DWORD( head + 28 ) = 8;            /* バインダ内こま数 */
  515.     DWORD( head + 32 ) = freq;        /* sound samp. freq */
  516.     DWORD( head + 36 ) = wt*freq/60*8;        /* バインダ内snd data Byte数 */
  517.     if( fwrite( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  518.         fclose(fp);
  519.         TL_free( buf );
  520.         return 2;            /* 2 = error num. */
  521.     }
  522.     if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){    /* v02 table */
  523.         fclose(fp);
  524.         TL_free( buf );
  525.         return 2;            /* 2 = error num. */
  526.     }
  527.  
  528.     switch( md ){
  529.         case 1: EGB_displayPage(guiEgbPtr,0,1);
  530.             EGB_resolution(guiEgbPtr,0,16);
  531.             EGB_writePage(guiEgbPtr,0);
  532.             EGB_displayStart(guiEgbPtr,2,8,1);
  533.             EGB_digitize(guiEgbPtr,1);
  534.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  535.             skip = 32 + wt*freq/60*8 ;
  536.             mouse(1);
  537.  
  538.             SND_fm_timer_b_set( 0, 0 ) ;
  539.             VSYNC_init();
  540.             VSYNC_setEvent( v02_trans_128_0 );
  541.  
  542.             f = 0 ;
  543.             for( i=0; i<frame; i += 8 )
  544.             {
  545.                 fseek( fp, skip, SEEK_CUR );
  546.  
  547.                 if( frame - i >= 8 )
  548.                 n = 8 ;
  549.                 else
  550.                 n = frame - i ;
  551.  
  552.                 for( j=0; j<n; j++ )
  553.                 {
  554.                 while( v02_digit_timing_flag0[j] == 0 );
  555.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  556.                     break;
  557.                 v02_digit_timing_flag0[j] = 0;
  558.                 f++ ;
  559.                 }
  560.             }
  561.  
  562.             VSYNC_end();
  563.             SND_fm_timer_b_start() ;
  564.             break;
  565.  
  566.         case 2: EGB_displayPage(guiEgbPtr,0,1);
  567.             EGB_resolution(guiEgbPtr,0,16);
  568.             EGB_writePage(guiEgbPtr,0);
  569.             EGB_displayStart(guiEgbPtr,2,8,1);
  570.             EGB_digitize(guiEgbPtr,1);
  571.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  572.             skip = 32 + wt*freq/60*8 ;
  573.             mouse(1);
  574.  
  575.             SND_fm_timer_b_set( 0, 0 ) ;
  576.             VSYNC_init();
  577.             VSYNC_setEvent( v02_trans_160_0 );
  578.  
  579.             f = 0 ;
  580.             for( i=0; i<frame; i += 8 )
  581.             {
  582.                 fseek( fp, skip, SEEK_CUR );
  583.  
  584.                 if( frame - i >= 8 )
  585.                 n = 8 ;
  586.                 else
  587.                 n = frame - i ;
  588.  
  589.                 for( j=0; j<n; j++ )
  590.                 {
  591.                 while( v02_digit_timing_flag0[j] == 0 );
  592.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  593.                     break;
  594.                 v02_digit_timing_flag0[j] = 0;
  595.                 f++ ;
  596.                 }
  597.             }
  598.  
  599.             VSYNC_end();
  600.             SND_fm_timer_b_start() ;
  601.             break;
  602.  
  603.         case 3: EGB_displayPage(guiEgbPtr,0,1);
  604.             EGB_resolution(guiEgbPtr,0,16);
  605.             EGB_writePage(guiEgbPtr,0);
  606.             EGB_displayStart(guiEgbPtr,2,4,1);
  607.             EGB_digitize(guiEgbPtr,1);
  608.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  609.             skip = 32 + wt*freq/60*8 ;
  610.             mouse(1);
  611.  
  612.             SND_fm_timer_b_set( 0, 0 ) ;
  613.             VSYNC_init();
  614.             VSYNC_setEvent( v02_trans_192_0 );
  615.  
  616.             f = 0 ;
  617.             for( i=0; i<frame; i += 8 )
  618.             {
  619.                 fseek( fp, skip, SEEK_CUR );
  620.  
  621.                 if( frame - i >= 8 )
  622.                 n = 8 ;
  623.                 else
  624.                 n = frame - i ;
  625.  
  626.                 for( j=0; j<n; j++ )
  627.                 {
  628.                 while( v02_digit_timing_flag0[j] == 0 );
  629.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  630.                     break;
  631.                 v02_digit_timing_flag0[j] = 0;
  632.                 f++ ;
  633.                 }
  634.             }
  635.  
  636.             VSYNC_end();
  637.             SND_fm_timer_b_start() ;
  638.             break;
  639.  
  640.         case 4: EGB_displayPage(guiEgbPtr,0,1);
  641.             EGB_resolution(guiEgbPtr,0,16);
  642.             EGB_writePage(guiEgbPtr,0);
  643.             EGB_displayStart(guiEgbPtr,2,4,1);
  644.             EGB_digitize(guiEgbPtr,1);
  645.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  646.             skip = 32 + wt*freq/60*8 ;
  647.             mouse(1);
  648.  
  649.             SND_fm_timer_b_set( 0, 0 ) ;
  650.             VSYNC_init();
  651.             VSYNC_setEvent( v02_trans_256_0 );
  652.  
  653.             f = 0 ;
  654.             for( i=0; i<frame; i += 8 )
  655.             {
  656.                 fseek( fp, skip, SEEK_CUR );
  657.  
  658.                 if( frame - i >= 8 )
  659.                 n = 8 ;
  660.                 else
  661.                 n = frame - i ;
  662.  
  663.                 for( j=0; j<n; j++ )
  664.                 {
  665.                 while( v02_digit_timing_flag0[j] == 0 );
  666.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  667.                     break;
  668.                 v02_digit_timing_flag0[j] = 0;
  669.                 f++ ;
  670.                 }
  671.             }
  672.  
  673.             VSYNC_end();
  674.             SND_fm_timer_b_start() ;
  675.             break;
  676.  
  677.         case 5: EGB_displayPage(guiEgbPtr,0,1);
  678.             EGB_resolution(guiEgbPtr,0,16);
  679.             EGB_writePage(guiEgbPtr,0);
  680.             EGB_displayStart(guiEgbPtr,2,4,1);
  681.             EGB_digitize(guiEgbPtr,1);
  682.             size = v02xd*v02yd*2*3/8 + 16 ;    /* frame size */
  683.             skip = 32 + wt*freq/60*8 ;
  684.             mouse(1);
  685.  
  686.             SND_fm_timer_b_set( 0, 0 ) ;
  687.             VSYNC_init();
  688.             VSYNC_setEvent( v02_trans_320_0 );
  689.  
  690.             f = 0 ;
  691.             for( i=0; i<frame; i += 8 )
  692.             {
  693.                 fseek( fp, skip, SEEK_CUR );
  694.  
  695.                 if( frame - i >= 8 )
  696.                 n = 8 ;
  697.                 else
  698.                 n = frame - i ;
  699.  
  700.                 for( j=0; j<n; j++ )
  701.                 {
  702.                 while( v02_digit_timing_flag0[j] == 0 );
  703.                 if( fwrite( b[j], size, 1, fp ) < 1 )
  704.                     break;
  705.                 v02_digit_timing_flag0[j] = 0;
  706.                 f++ ;
  707.                 }
  708.             }
  709.  
  710.             VSYNC_end();
  711.             SND_fm_timer_b_start() ;
  712.             break;
  713.     }
  714.  
  715.             /* mute */
  716.     int s ;
  717.     SND_get_elevol_mute( &s ) ;
  718.     SND_elevol_mute( s & 0xfffffff3 ) ;
  719.  
  720.     EGB_digitize(guiEgbPtr,0);
  721.     EGB_displayPage(guiEgbPtr,0,0);
  722.  
  723.     EGB_color( guiEgbPtr, 1, 0 ) ;
  724.     EGB_clearScreen( guiEgbPtr ) ;            /*    画面をきれいにしよう */
  725.  
  726.     fseek( fp, 0, SEEK_SET );
  727.     fseek( fp, 256+32768+512, SEEK_CUR );
  728.  
  729.     for( i=0 ; i<(wt*freq/60*8) ; i += 4 )
  730.         DWORD( buf + i ) = 0x80808080 ;
  731.     bind = 0 ;
  732.     for( i=0 ; i<f ; i += 8 )
  733.     {
  734.         if( f - i >= 8 )
  735.             n = 8 ;
  736.         else
  737.             n = f - i ;
  738.  
  739.         for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
  740.         DWORD( bind_head ) = bind;
  741.         DWORD( bind_head + 4 ) = wt*freq/60*8 + (16 + v02xd*v02yd*2*3/8)*n ;
  742.         if( fwrite( bind_head, 32, 1, fp ) < 1 )
  743.         {
  744.             fclose(fp);
  745.             TL_free( buf );
  746.             return 2;            /* 2 = error num. */
  747.         }
  748.         if( fwrite( buf, wt*freq/60*8, 1, fp ) < 1 )
  749.         {
  750.             fclose(fp);
  751.             TL_free( buf );
  752.             return 2;            /* 2 = error num. */
  753.         }
  754.         if( n < 8 )
  755.             break ;
  756.         fseek( fp, (16 + v02xd*v02yd*2*3/8)*8, SEEK_CUR );
  757.         bind++ ;
  758.     }
  759.  
  760.         /* total data size 修正 */
  761.  
  762.     total = 32768 + 512 ;
  763.     if( f%8 )
  764.         total = total + (f/8 + 1)*(32+wt*freq/60*8) ;
  765.     else
  766.         total = total + f/8*(32+wt*freq/60*8) ;
  767.     total = total + f*(v02xd*v02yd*2*3/8 + 16) ;
  768.  
  769.     fseek( fp, 0, SEEK_SET );
  770.     DWORD( head + 4 ) = total ;        /* total length */
  771.     DWORD( head + 8 ) = f;            /* total frame     */
  772.     if( fwrite( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  773.         fclose(fp);
  774.         TL_free( buf );
  775.         return 2;            /* 2 = error num. */
  776.     }
  777.  
  778.     fclose(fp);
  779.     TL_free( buf );
  780.     if( f < frame )return 2;
  781.     else return 0;
  782. }
  783.  
  784. v02_snd_save_0( name )
  785. char *name ;
  786. {
  787.     FILE *fp;
  788.     int i, count, f, wt, freq, total, bf, bsnd, stotal, sndp, bsize;
  789.     char head[256], bind_head[32] ;
  790.     char *buf ;                /* buffer */
  791.  
  792.     if( ( fp = fopen( name, "rb" ) ) == NULL ){
  793.         return 1;
  794.     }
  795.     if( fread( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  796.         fclose(fp);
  797.         return 1;
  798.     }
  799.     fclose(fp);
  800.  
  801.     total = DWORD( head + 4 ) ;        /* total length */
  802.     f = DWORD( head + 8 );            /* total frame     */
  803.     wt = DWORD( head + 24 );        /* wait */
  804.     if( wt == 0 )
  805.         wt = 6 ;
  806.     bf = DWORD( head + 28 );        /* バインダ内こま数 */
  807.     if( bf == 0 )
  808.         bf = 8 ;
  809.     freq = DWORD( head + 32 );        /* sound samp. freq */
  810.     if( freq == 0 )
  811.         freq = 8000*6/wt ;
  812.     bsnd = DWORD( head + 36 );        /* バインダ内snd data Byte数 */
  813.     if( bsnd == 0 )
  814.         bsnd = 6400 ;
  815.  
  816.     stotal = freq * f * wt / 60 ;
  817.  
  818.     if( ( buf = (char *)TL_malloc( stotal + bsnd ) ) == NULL )
  819.     {
  820.         return 7;
  821.     }
  822.     for( i=0 ; i<bsnd-4 ; i += 4 )
  823.         DWORD( buf + stotal + i ) = 0x80808080 ;
  824.     /* 1バインダのクッションが必要 */
  825.  
  826.     EGB_displayPage(guiEgbPtr,0,1);
  827.     EGB_resolution(guiEgbPtr,0,16);
  828.     EGB_writePage(guiEgbPtr,0);
  829.     EGB_displayStart(guiEgbPtr,2,4,1);
  830.     EGB_digitize(guiEgbPtr,1);
  831.  
  832.     mouse(1);
  833.  
  834.     interrupt_disable() ;
  835.     SND_pcm_rec( freq, buf, stotal, 0 );
  836.     interrupt_enable() ;
  837.  
  838.             /* mute */
  839.     int s ;
  840.     SND_get_elevol_mute( &s ) ;
  841.     SND_elevol_mute( s & 0xfffffff3 ) ;
  842.  
  843.     EGB_digitize(guiEgbPtr,0);
  844.     EGB_displayPage(guiEgbPtr,0,0);
  845.  
  846.     EGB_color( guiEgbPtr, 1, 0 ) ;
  847.     EGB_clearScreen( guiEgbPtr ) ;            /*    画面をきれいにしよう */
  848.  
  849.     if( ( fp = fopen( name, "r+b" ) ) == NULL ){
  850.         return 2;
  851.     }
  852.  
  853.     count = 256+32768+512 ;
  854.     if( count >= total + 256 )
  855.     {
  856.         TL_free( buf );
  857.         fclose(fp);
  858.         return 58;
  859.     }
  860.  
  861.     sndp = 0 ;
  862.     for( i=0; i<f; i += bf )
  863.     {
  864.         fseek( fp, count, SEEK_SET );
  865.         if( fread( bind_head, 32, 1, fp ) < 1 )
  866.         {
  867.             fclose(fp);
  868.             TL_free( buf );
  869.             return 1;
  870.         }
  871.         count = count + 32 ;
  872.         if( count > total + 256 )
  873.             break ;
  874.  
  875.         bsize = DWORD( bind_head + 4 ) ;
  876.         if( bsize <= bsnd )
  877.             break ;
  878.  
  879.         if( sndp+bsnd < stotal )
  880.         {
  881.             fseek( fp, count, SEEK_SET );
  882.             if( fwrite( buf+sndp, bsnd, 1, fp ) < 1 )
  883.             {
  884.                 fclose(fp);
  885.                 TL_free( buf );
  886.                 return 2;
  887.             }
  888.             sndp = sndp + bsnd ;
  889.         }
  890.         else
  891.         {
  892.             fseek( fp, count, SEEK_SET );
  893.             if( fwrite( buf+sndp, stotal-sndp, 1, fp ) < 1 )
  894.             {
  895.                 fclose(fp);
  896.                 TL_free( buf );
  897.                 return 2;
  898.             }
  899.             break ;
  900.         }
  901.  
  902.         count = count + bsize ;
  903.         if( count > total + 256 )
  904.             break ;
  905.     }
  906.  
  907.     fclose(fp);
  908.     TL_free( buf );
  909.     return 0;
  910. }
  911.  
  912. v02_digit_snd_save( name, frame, md, wt, ytab, ctab, v02tab )
  913. char *name;
  914. int frame, md, wt;
  915. char *ytab, *ctab, *v02tab ;
  916. {
  917.     FILE *fp;
  918.     int freq ;
  919.     int v02xd = 128, v02yd = 96;
  920.     int i, j, size, error;
  921.     char head[256], bind_head[32], data_top[16] ;
  922.     char *buf, *snd, *wk ;        /* buffer */
  923.  
  924.     error = 0;
  925.     switch( wt ){
  926.         case 4: freq = 12000 ;
  927.             break;
  928.         case 5: freq = 9600 ;
  929.             break;
  930.         case 6: freq = 8000 ;
  931.             break;
  932.         case 7: freq = 6857 ;
  933.             break;
  934.         default: return 58 ;
  935.     }
  936.     switch( md ){
  937.         case 1: v02xd = 128; v02yd = 96;
  938.             break;
  939.         case 2: v02xd = 160; v02yd = 120;
  940.             break;
  941.         case 3: v02xd = 192; v02yd = 144;
  942.             break;
  943.         case 4: v02xd = 256; v02yd = 192;
  944.             break;
  945.         case 5: v02xd = 320; v02yd = 240;
  946.             break;
  947.         default: return 58 ;
  948.     }
  949.     size = v02xd*v02yd*2;        /* frame size */
  950.     if( ( buf = (char *)TL_malloc( size*frame*3/8 + size ) ) == NULL )
  951.     {
  952.         error = 7;
  953.         goto vd11;
  954.     }
  955.     wk = buf + size*frame*3/8 ;
  956.     if( ( snd = (char *)TL_malloc( frame*800 + 20000 ) ) == NULL )
  957.     {
  958.         error = 7;
  959.         goto vd10;
  960.     }
  961.     for( i=0 ; i<20000-100 ; i += 4 )
  962.         DWORD( snd + frame*800 + i ) = 0x80808080 ;
  963.     /* 1バインダ(v00タイプなら6400,mvbなら15360のクッションが必要 */
  964.     /* ここでは余裕をみて20K取っている */
  965.  
  966.     switch( md ){
  967.         case 1: EGB_displayPage(guiEgbPtr,0,1);
  968.             EGB_resolution(guiEgbPtr,0,16);
  969.             EGB_writePage(guiEgbPtr,0);
  970.             EGB_displayStart(guiEgbPtr,2,8,1);
  971.             EGB_digitize(guiEgbPtr,1);
  972.             mouse(1);
  973.  
  974. //            SND_fm_timer_b_set( 0, 0 ) ;
  975.  
  976.             switch( wt ){
  977.                 case 4: v02_snd_trans_128_4( snd, frame*800,
  978.                     buf, frame, wt*320, wt*320 - 320/2,
  979.                     ytab, ctab, wk ) ;
  980.                     break;
  981.                 case 5: v02_snd_trans_128_5( snd, frame*800,
  982.                     buf, frame, wt*320, wt*320 - 320/2,
  983.                     ytab, ctab, wk ) ;
  984.                     break;
  985.                 case 6: v02_snd_trans_128_6( snd, frame*800,
  986.                     buf, frame, wt*320, wt*320 - 320/2,
  987.                     ytab, ctab, wk ) ;
  988.                     break;
  989.                 case 7: v02_snd_trans_128_7( snd, frame*800,
  990.                     buf, frame, wt*320, wt*320 - 320/2,
  991.                     ytab, ctab, wk ) ;
  992.                     break;
  993.             }
  994.  
  995. //            SND_fm_timer_b_start() ;
  996.             break;
  997.  
  998.         case 2: EGB_displayPage(guiEgbPtr,0,1);
  999.             EGB_resolution(guiEgbPtr,0,16);
  1000.             EGB_writePage(guiEgbPtr,0);
  1001.             EGB_displayStart(guiEgbPtr,2,8,1);
  1002.             EGB_digitize(guiEgbPtr,1);
  1003.             mouse(1);
  1004.  
  1005. //            SND_fm_timer_b_set( 0, 0 ) ;
  1006.  
  1007.             switch( wt ){
  1008.                 case 4: v02_snd_trans_160_4( snd, frame*800,
  1009.                     buf, frame, wt*320, wt*320 - 320/2,
  1010.                     ytab, ctab, wk ) ;
  1011.                     break;
  1012.                 case 5: v02_snd_trans_160_5( snd, frame*800,
  1013.                     buf, frame, wt*320, wt*320 - 320/2,
  1014.                     ytab, ctab, wk ) ;
  1015.                     break;
  1016.                 case 6: v02_snd_trans_160_6( snd, frame*800,
  1017.                     buf, frame, wt*320, wt*320 - 320/2,
  1018.                     ytab, ctab, wk ) ;
  1019.                     break;
  1020.                 case 7: v02_snd_trans_160_7( snd, frame*800,
  1021.                     buf, frame, wt*320, wt*320 - 320/2,
  1022.                     ytab, ctab, wk ) ;
  1023.                     break;
  1024.             }
  1025.  
  1026. //            SND_fm_timer_b_start() ;
  1027.             break;
  1028.  
  1029.         case 3: EGB_displayPage(guiEgbPtr,0,1);
  1030.             EGB_resolution(guiEgbPtr,0,16);
  1031.             EGB_writePage(guiEgbPtr,0);
  1032.             EGB_displayStart(guiEgbPtr,2,4,1);
  1033.             EGB_digitize(guiEgbPtr,1);
  1034.             mouse(1);
  1035.  
  1036. //            SND_fm_timer_b_set( 0, 0 ) ;
  1037.  
  1038.             switch( wt ){
  1039.                 case 4: v02_snd_trans_192_4( snd, frame*800,
  1040.                     buf, frame, wt*320, wt*320 - 320/2,
  1041.                     ytab, ctab, wk ) ;
  1042.                     break;
  1043.                 case 5: v02_snd_trans_192_5( snd, frame*800,
  1044.                     buf, frame, wt*320, wt*320 - 320/2,
  1045.                     ytab, ctab, wk ) ;
  1046.                     break;
  1047.                 case 6: v02_snd_trans_192_6( snd, frame*800,
  1048.                     buf, frame, wt*320, wt*320 - 320/2,
  1049.                     ytab, ctab, wk ) ;
  1050.                     break;
  1051.                 case 7: v02_snd_trans_192_7( snd, frame*800,
  1052.                     buf, frame, wt*320, wt*320 - 320/2,
  1053.                     ytab, ctab, wk ) ;
  1054.                     break;
  1055.             }
  1056.  
  1057. //            SND_fm_timer_b_start() ;
  1058.             break;
  1059.  
  1060.         case 4: EGB_displayPage(guiEgbPtr,0,1);
  1061.             EGB_resolution(guiEgbPtr,0,16);
  1062.             EGB_writePage(guiEgbPtr,0);
  1063.             EGB_displayStart(guiEgbPtr,2,4,1);
  1064.             EGB_digitize(guiEgbPtr,1);
  1065.             mouse(1);
  1066.  
  1067. //            SND_fm_timer_b_set( 0, 0 ) ;
  1068.  
  1069.             switch( wt ){
  1070.                 case 4: v02_snd_trans_256_4( snd, frame*800,
  1071.                     buf, frame, wt*320, wt*320 - 320/2,
  1072.                     ytab, ctab, wk ) ;
  1073.                     break;
  1074.                 case 5: v02_snd_trans_256_5( snd, frame*800,
  1075.                     buf, frame, wt*320, wt*320 - 320/2,
  1076.                     ytab, ctab, wk ) ;
  1077.                     break;
  1078.                 case 6: v02_snd_trans_256_6( snd, frame*800,
  1079.                     buf, frame, wt*320, wt*320 - 320/2,
  1080.                     ytab, ctab, wk ) ;
  1081.                     break;
  1082.                 case 7: v02_snd_trans_256_7( snd, frame*800,
  1083.                     buf, frame, wt*320, wt*320 - 320/2,
  1084.                     ytab, ctab, wk ) ;
  1085.                     break;
  1086.             }
  1087.  
  1088. //            SND_fm_timer_b_start() ;
  1089.             break;
  1090.  
  1091.         case 5: EGB_displayPage(guiEgbPtr,0,1);
  1092.             EGB_resolution(guiEgbPtr,0,16);
  1093.             EGB_writePage(guiEgbPtr,0);
  1094.             EGB_displayStart(guiEgbPtr,2,4,1);
  1095.             EGB_digitize(guiEgbPtr,1);
  1096.             mouse(1);
  1097.  
  1098. //            SND_fm_timer_b_set( 0, 0 ) ;
  1099.  
  1100.             switch( wt ){
  1101.                 case 4: v02_snd_trans_320_4( snd, frame*800,
  1102.                     buf, frame, wt*320, wt*320 - 320/2,
  1103.                     ytab, ctab, wk ) ;
  1104.                     break;
  1105.                 case 5: v02_snd_trans_320_5( snd, frame*800,
  1106.                     buf, frame, wt*320, wt*320 - 320/2,
  1107.                     ytab, ctab, wk ) ;
  1108.                     break;
  1109.                 case 6: v02_snd_trans_320_6( snd, frame*800,
  1110.                     buf, frame, wt*320, wt*320 - 320/2,
  1111.                     ytab, ctab, wk ) ;
  1112.                     break;
  1113.                 case 7: v02_snd_trans_320_7( snd, frame*800,
  1114.                     buf, frame, wt*320, wt*320 - 320/2,
  1115.                     ytab, ctab, wk ) ;
  1116.                     break;
  1117.             }
  1118.  
  1119. //            SND_fm_timer_b_start() ;
  1120.             break;
  1121.     }
  1122.             /* mute */
  1123.     int s ;
  1124.     SND_get_elevol_mute( &s ) ;
  1125.     SND_elevol_mute( s & 0xfffffff3 ) ;
  1126.  
  1127.     EGB_digitize(guiEgbPtr,0);
  1128.     EGB_displayPage(guiEgbPtr,0,0);
  1129.  
  1130.     EGB_color( guiEgbPtr, 1, 0 ) ;
  1131.     EGB_clearScreen( guiEgbPtr ) ;            /*    画面をきれいにしよう */
  1132.  
  1133.     for( i=0 ; i<frame*800 ; i++ )
  1134.     {
  1135.         if( BYTE( snd+i ) == 0 )
  1136.             BYTE( snd+i ) = 1 ;
  1137.         if( BYTE( snd+i ) == 255 )
  1138.             BYTE( snd+i ) = 254 ;
  1139.  
  1140.         if( BYTE( snd+i ) < 128 )
  1141.             BYTE( snd+i ) = 128 - BYTE( snd+i ) ;
  1142.     }
  1143.  
  1144. vd06:    if( ( fp = fopen( name, "wb" ) ) == NULL ){
  1145.         error = 2;
  1146.         TL_free( snd );
  1147.         goto vd10;
  1148.     }
  1149.  
  1150.     int total, sndp, dtp, bind, fcount, n ;
  1151.     total = 0 ; sndp = 0 ; dtp = 0 ; bind = 0 ; fcount = 0 ;
  1152.  
  1153.     for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
  1154.     DWORD( head ) = 0x32304456;        /* ID = VD02 */
  1155.     DWORD( head + 4 ) = 0 ;            /* total length */
  1156.     DWORD( head + 8 ) = 0 ;            /* total frame */
  1157.     DWORD( head + 12 ) = 6;        /* dataの種類番号(bit/ピクセル) */
  1158.     DWORD( head + 16 ) = v02xd;        /* 横 */
  1159.     DWORD( head + 20 ) = v02yd;        /* 縦 */
  1160.     DWORD( head + 24 ) = wt;        /* wait */
  1161.     DWORD( head + 28 ) = 8;            /* バインダ内こま数 */
  1162.     DWORD( head + 32 ) = 8000*6/wt;        /* sound samp. freq */
  1163.     DWORD( head + 36 ) = 6400;        /* バインダ内snd data Byte数 */
  1164.     if( fwrite( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  1165.         error = 2;
  1166.         goto vd08;
  1167.     }
  1168.  
  1169.     if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){    /* v02 table */
  1170.         error = 2;
  1171.         goto vd08;
  1172.     }
  1173.     total = total + 32768+512 ;
  1174.  
  1175.     WORD( data_top + 0 ) = 1 ;
  1176.     WORD( data_top + 2 ) = 0x2104 ;
  1177.     DWORD( data_top + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
  1178.     DWORD( data_top + 8 ) = 1 ;
  1179.     BYTE( data_top + 12 ) = 0 ;
  1180.     BYTE( data_top + 13 ) = 0xff ;
  1181.     WORD( data_top + 14 ) = v02xd*v02yd*2*3/8 ;
  1182.  
  1183.     for( i=0 ; i<frame ; i += 8 )
  1184.     {
  1185.         if( frame - i >= 8 )
  1186.             n = 8 ;
  1187.         else
  1188.             n = frame - i ;
  1189.  
  1190.         for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
  1191.         DWORD( bind_head ) = bind;
  1192.         DWORD( bind_head + 4 ) = 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
  1193.         if( fwrite( bind_head, 32, 1, fp ) < 1 )
  1194.         {
  1195.             error = 2;
  1196.             goto vd08;
  1197.         }
  1198.  
  1199.         if( fwrite( snd + sndp, 6400, 1, fp ) < 1 )
  1200.         {
  1201.             error = 2;
  1202.             goto vd08;
  1203.         }
  1204.         sndp += 6400 ;
  1205.  
  1206.         for( j=0 ; j<n ; j++ )
  1207.         {
  1208.             if( fwrite( data_top, 16, 1, fp ) < 1 )
  1209.             {
  1210.                 error = 2;
  1211.                 goto vd08;
  1212.             }
  1213.  
  1214.             if( fwrite(buf+dtp, v02xd*v02yd*2*3/8, 1, fp) < 1 )
  1215.             {
  1216.                 error = 2;
  1217.                 goto vd08;
  1218.             }
  1219.             dtp += v02xd*v02yd*2*3/8 ;
  1220.         }
  1221.         total = total + 32 + 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
  1222.         bind++ ;
  1223.         fcount += n ;
  1224.     }
  1225.  
  1226. vd08:    fseek( fp, 0, SEEK_SET ) ;
  1227.     DWORD( head + 4 ) = total ;         /* total length */
  1228.     DWORD( head + 8 ) = fcount ;        /* total frame     */
  1229.     if( fwrite( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  1230.         error = 2;
  1231.     }
  1232.     TL_free( snd );
  1233. vd09:    fclose(fp);
  1234. vd10:    TL_free( buf );
  1235. vd11:    
  1236.  
  1237.     return error;
  1238. }
  1239.  
  1240. /* サンプリングレート 9600 19200 サポート版(fq=0:9600 fq=1:19200) */
  1241.  
  1242. v02_digit_snd_save2( name, frame, md, fq, wt, ytab, ctab, v02tab )
  1243. char *name;
  1244. int frame, md, fq, wt;
  1245. char *ytab, *ctab, *v02tab ;
  1246. {
  1247.     FILE *fp;
  1248.     int freq ;
  1249.     int v02xd = 128, v02yd = 96;
  1250.     int i, j, size, error;
  1251.     char head[256], bind_head[32], data_top[16] ;
  1252.     char *buf, *snd, *wk ;        /* buffer */
  1253.  
  1254.     error = 0;
  1255.     switch( fq ){
  1256.         case 0: freq = 9600 ;
  1257.             break;
  1258.         case 1: freq = 19200 ;
  1259.             break;
  1260.         default: return 58 ;
  1261.     }
  1262.     switch( md ){
  1263.         case 1: v02xd = 128; v02yd = 96;
  1264.             break;
  1265.         case 2: v02xd = 160; v02yd = 120;
  1266.             break;
  1267.         case 3: v02xd = 192; v02yd = 144;
  1268.             break;
  1269.         case 4: v02xd = 256; v02yd = 192;
  1270.             break;
  1271.         case 5: v02xd = 320; v02yd = 240;
  1272.             break;
  1273.         default: return 58 ;
  1274.     }
  1275.     size = v02xd*v02yd*2;        /* frame size */
  1276.     if( ( buf = (char *)TL_malloc( size*frame*3/8 + size ) ) == NULL )
  1277.     {
  1278.         error = 7;
  1279.         goto vd11;
  1280.     }
  1281.     wk = buf + size*frame*3/8 ;
  1282.     if( ( snd = (char *)TL_malloc( frame*wt*freq/60 + 20000 ) ) == NULL )
  1283.     {
  1284.         error = 7;
  1285.         goto vd10;
  1286.     }
  1287.     for( i=0 ; i<20000-100 ; i += 4 )
  1288.         DWORD( snd + frame*wt*freq/60 + i ) = 0x80808080 ;
  1289.     /* 1バインダ(v00タイプなら6400,mvbなら15360)のクッションが必要 */
  1290.     /* ここでは余裕をみて20K取っている */
  1291.  
  1292.     switch( md ){
  1293.         case 1: EGB_displayPage(guiEgbPtr,0,1);
  1294.             EGB_resolution(guiEgbPtr,0,16);
  1295.             EGB_writePage(guiEgbPtr,0);
  1296.             EGB_displayStart(guiEgbPtr,2,8,1);
  1297.             EGB_digitize(guiEgbPtr,1);
  1298.             mouse(1);
  1299.  
  1300.             switch( freq ){
  1301.             case 9600:
  1302.                 v02_trans_128_9600( snd, frame*wt*freq/60,
  1303.                     buf, frame, wt*320, wt*320 - 320/2,
  1304.                     ytab, ctab, wk ) ;
  1305.                 break ;
  1306.             case 19200:
  1307.                 v02_trans_128_19200( snd, frame*wt*freq/60,
  1308.                     buf, frame, wt*320, wt*320 - 320/2,
  1309.                     ytab, ctab, wk ) ;
  1310.                 break ;
  1311.             }
  1312.             break;
  1313.  
  1314.         case 2: EGB_displayPage(guiEgbPtr,0,1);
  1315.             EGB_resolution(guiEgbPtr,0,16);
  1316.             EGB_writePage(guiEgbPtr,0);
  1317.             EGB_displayStart(guiEgbPtr,2,8,1);
  1318.             EGB_digitize(guiEgbPtr,1);
  1319.             mouse(1);
  1320.  
  1321.             switch( freq ){
  1322.             case 9600:
  1323.                 v02_trans_160_9600( snd, frame*wt*freq/60,
  1324.                     buf, frame, wt*320, wt*320 - 320/2,
  1325.                     ytab, ctab, wk ) ;
  1326.                 break ;
  1327.             case 19200:
  1328.                 v02_trans_160_19200( snd, frame*wt*freq/60,
  1329.                     buf, frame, wt*320, wt*320 - 320/2,
  1330.                     ytab, ctab, wk ) ;
  1331.                 break ;
  1332.             }
  1333.             break;
  1334.  
  1335.         case 3: EGB_displayPage(guiEgbPtr,0,1);
  1336.             EGB_resolution(guiEgbPtr,0,16);
  1337.             EGB_writePage(guiEgbPtr,0);
  1338.             EGB_displayStart(guiEgbPtr,2,4,1);
  1339.             EGB_digitize(guiEgbPtr,1);
  1340.             mouse(1);
  1341.  
  1342.             switch( freq ){
  1343.             case 9600:
  1344.                 v02_trans_192_9600( snd, frame*wt*freq/60,
  1345.                     buf, frame, wt*320, wt*320 - 320/2,
  1346.                     ytab, ctab, wk ) ;
  1347.                 break ;
  1348.             case 19200:
  1349.                 v02_trans_192_19200( snd, frame*wt*freq/60,
  1350.                     buf, frame, wt*320, wt*320 - 320/2,
  1351.                     ytab, ctab, wk ) ;
  1352.                 break ;
  1353.             }
  1354.             break;
  1355.  
  1356.         case 4: EGB_displayPage(guiEgbPtr,0,1);
  1357.             EGB_resolution(guiEgbPtr,0,16);
  1358.             EGB_writePage(guiEgbPtr,0);
  1359.             EGB_displayStart(guiEgbPtr,2,4,1);
  1360.             EGB_digitize(guiEgbPtr,1);
  1361.             mouse(1);
  1362.  
  1363.             switch( freq ){
  1364.             case 9600:
  1365.                 v02_trans_256_9600( snd, frame*wt*freq/60,
  1366.                     buf, frame, wt*320, wt*320 - 320/2,
  1367.                     ytab, ctab, wk ) ;
  1368.                 break ;
  1369.             case 19200:
  1370.                 v02_trans_256_19200( snd, frame*wt*freq/60,
  1371.                     buf, frame, wt*320, wt*320 - 320/2,
  1372.                     ytab, ctab, wk ) ;
  1373.                 break ;
  1374.             }
  1375.             break;
  1376.  
  1377.         case 5: EGB_displayPage(guiEgbPtr,0,1);
  1378.             EGB_resolution(guiEgbPtr,0,16);
  1379.             EGB_writePage(guiEgbPtr,0);
  1380.             EGB_displayStart(guiEgbPtr,2,4,1);
  1381.             EGB_digitize(guiEgbPtr,1);
  1382.             mouse(1);
  1383.  
  1384.             switch( freq ){
  1385.             case 9600:
  1386.                 v02_trans_320_9600( snd, frame*wt*freq/60,
  1387.                     buf, frame, wt*320, wt*320 - 320/2,
  1388.                     ytab, ctab, wk ) ;
  1389.                 break ;
  1390.             case 19200:
  1391.                 v02_trans_320_19200( snd, frame*wt*freq/60,
  1392.                     buf, frame, wt*320, wt*320 - 320/2,
  1393.                     ytab, ctab, wk ) ;
  1394.                 break ;
  1395.             }
  1396.             break;
  1397.     }
  1398.             /* mute */
  1399.     int s ;
  1400.     SND_get_elevol_mute( &s ) ;
  1401.     SND_elevol_mute( s & 0xfffffff3 ) ;
  1402.  
  1403.     EGB_digitize(guiEgbPtr,0);
  1404.     EGB_displayPage(guiEgbPtr,0,0);
  1405.  
  1406.     EGB_color( guiEgbPtr, 1, 0 ) ;
  1407.     EGB_clearScreen( guiEgbPtr ) ;            /*    画面をきれいにしよう */
  1408.  
  1409.     for( i=0 ; i<(frame*wt*freq/60) ; i++ )
  1410.     {
  1411.         if( BYTE( snd+i ) == 0 )
  1412.             BYTE( snd+i ) = 1 ;
  1413.         if( BYTE( snd+i ) == 255 )
  1414.             BYTE( snd+i ) = 254 ;
  1415.  
  1416.         if( BYTE( snd+i ) < 128 )
  1417.             BYTE( snd+i ) = 128 - BYTE( snd+i ) ;
  1418.     }
  1419.  
  1420. vd06:    if( ( fp = fopen( name, "wb" ) ) == NULL ){
  1421.         error = 2;
  1422.         TL_free( snd );
  1423.         goto vd10;
  1424.     }
  1425.  
  1426.     int total, sndp, dtp, bind, fcount, n ;
  1427.     total = 0 ; sndp = 0 ; dtp = 0 ; bind = 0 ; fcount = 0 ;
  1428.  
  1429.     for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
  1430.     DWORD( head ) = 0x32304456;        /* ID = VD02 */
  1431.     DWORD( head + 4 ) = 0 ;            /* total length */
  1432.     DWORD( head + 8 ) = 0 ;            /* total frame */
  1433.     DWORD( head + 12 ) = 7;        /* dataの種類番号(mvbType) */
  1434.     DWORD( head + 16 ) = v02xd;        /* 横 */
  1435.     DWORD( head + 20 ) = v02yd;        /* 縦 */
  1436.     DWORD( head + 24 ) = wt;        /* wait */
  1437.     DWORD( head + 28 ) = 8;            /* バインダ内こま数 */
  1438.     DWORD( head + 32 ) = freq;        /* sound samp. freq */
  1439.     DWORD( head + 36 ) = wt*freq/60*8;        /* バインダ内snd data Byte数 */
  1440.     if( fwrite( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  1441.         error = 2;
  1442.         goto vd08;
  1443.     }
  1444.  
  1445.     if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){    /* v02 table */
  1446.         error = 2;
  1447.         goto vd08;
  1448.     }
  1449.     total = total + 32768+512 ;
  1450.  
  1451.     WORD( data_top + 0 ) = 1 ;
  1452.     WORD( data_top + 2 ) = 0x2104 ;
  1453.     DWORD( data_top + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
  1454.     DWORD( data_top + 8 ) = 1 ;
  1455.     BYTE( data_top + 12 ) = 0 ;
  1456.     BYTE( data_top + 13 ) = 0xff ;
  1457.     WORD( data_top + 14 ) = v02xd*v02yd*2*3/8 ;
  1458.  
  1459.     for( i=0 ; i<frame ; i += 8 )
  1460.     {
  1461.         if( frame - i >= 8 )
  1462.             n = 8 ;
  1463.         else
  1464.             n = frame - i ;
  1465.  
  1466.         for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
  1467.         DWORD( bind_head ) = bind;
  1468.         DWORD( bind_head + 4 ) = wt*freq/60*8 + (16 + v02xd*v02yd*2*3/8)*n ;
  1469.         if( fwrite( bind_head, 32, 1, fp ) < 1 )
  1470.         {
  1471.             error = 2;
  1472.             goto vd08;
  1473.         }
  1474.  
  1475.         if( fwrite( snd + sndp, wt*freq/60*8, 1, fp ) < 1 )
  1476.         {
  1477.             error = 2;
  1478.             goto vd08;
  1479.         }
  1480.         sndp += (wt*freq/60*8) ;
  1481.  
  1482.         for( j=0 ; j<n ; j++ )
  1483.         {
  1484.             if( fwrite( data_top, 16, 1, fp ) < 1 )
  1485.             {
  1486.                 error = 2;
  1487.                 goto vd08;
  1488.             }
  1489.  
  1490.             if( fwrite(buf+dtp, v02xd*v02yd*2*3/8, 1, fp) < 1 )
  1491.             {
  1492.                 error = 2;
  1493.                 goto vd08;
  1494.             }
  1495.             dtp += v02xd*v02yd*2*3/8 ;
  1496.         }
  1497.         total = total + 32 + (wt*freq/60*8) + (16 + v02xd*v02yd*2*3/8)*n ;
  1498.         bind++ ;
  1499.         fcount += n ;
  1500.     }
  1501.  
  1502. vd08:    fseek( fp, 0, SEEK_SET ) ;
  1503.     DWORD( head + 4 ) = total ;         /* total length */
  1504.     DWORD( head + 8 ) = fcount ;        /* total frame     */
  1505.     if( fwrite( head, 256, 1, fp ) < 1 ){    /* ヘッダー */
  1506.         error = 2;
  1507.     }
  1508.     TL_free( snd );
  1509. vd09:    fclose(fp);
  1510. vd10:    TL_free( buf );
  1511. vd11:    
  1512.  
  1513.     return error;
  1514. }
  1515.  
  1516.